A typical computer system includes a processor, a non-volatile storage device like a hard disk drive, and volatile storage, usually referred to as memory. The memory may be dynamic random-access memory (DRAM). Usually the memory is organized as a number of memory modules, such as single in-line memory modules (SIMM's) and dual in-line memory modules (DIMM's), among other types of memory modules.
To access the memory of a computer system, the computer system may include a memory controller. The memory controller is, a component, such as one or more integrated circuits (IC's), which interfaces directly with the memory modules of the system. All accesses to the memory modules are thus made through the memory controller.
A memory controller typically has a number of ports. Each memory module is connected to one of the ports, where each port is able to accept one or more memory modules. A port is an individual communication entity that enables access of the memory modules coupled to it independent of the memory modules coupled to the other ports.
The memory of a computer system is addressable by a number of memory addresses. One job of the memory controller is to receive a given memory address, and determine to which location of which memory module of which port the given memory address corresponds. Once this determination has been made, the contents of the memory location can be read or written as desired.
Prior art memory controllers are limited in the different physical configurations that are allowed of memory modules vis-à-vis the ports to which they are connected. For example, at least some memory controllers require symmetric population of memory modules within the ports, such that each port has an equal number of memory modules connected thereto. Other memory controllers require that the same type and/or size of memory modules populating their ports. Such restrictions limit the design choices of builders of computer systems.
Furthermore, prior art memory controllers typically do not allow for dynamic reconfiguration of the memory modules inserted into their ports. To add a memory module, to remove an existing memory module, or to move a memory module from one port to another port usually requires that the entire computer system be at best temporarily halted, and at worst shut down. For mission-critical computer systems that may need additional memory, temporarily halting or shutting down the systems to add memory can be inconvenient at best, and not allowed at worst.
The prior art limitations of the physical configurations of memory modules and the prior art inability to allow dynamic reconfiguration of memory modules are especially problematic in the context of systems having more than one partition. A partition is a separate logical entity within a computer system, which nevertheless shares resources with the other partitions of the system. Each partition may have its own memory address space that has to be mapped to the memory modules of the computer system, independently of the other partitions. The limitations of existing memory controllers described above make the allocation of the memory of a system among the different partitions a complex process. Furthermore, the inability of existing memory controllers to allow dynamic reconfiguration of memory modules can make it difficult to allow reallocation of memory among the partitions of a system, decreasing their flexibility.
Existing memory controllers may also require complex arithmetical computations to determine to which location of which memory module of which port a given memory address corresponds. Performance of these computations by the memory controllers tends to increase latency of the memory controllers, thus slowing down the performance of the entire computer systems of which they are a part. Such a reduction in performance is undesirable to builders of computer systems.
Finally, in mission-critical and other types of computer systems, redundancy within the memory is often desirable, so that the systems can continue to function if a given memory module fails. Many times the only way to achieve such redundancy is to provide redundant memory modules for all the memory modules within a system. That is, each primary memory module has a backup memory module that can act as a new primary module should the existing primary module fail. However, this type of redundancy may not be needed for all the memory modules within a system, wasting resources.
For all of these reasons, as well as other reasons, there is a need for the present invention.